//string的api用法

package main

import (
	"errors"
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
	"strings"
)

func main() {
	var str = "hello world"
	var sub_str = "world"
	var long_str = "hello world, big world"
	contains(str, sub_str)
	countWord(long_str, sub_str)
	equalFold()
	//文件操作
	open_file()
	readFile()
	createFile()

	recursivelyRead()
	dirList()

	err := errors.New("自定义异常")
	fmt.Println(err)

	readAll()
}

//两个字串的utf8编码比较。大小写不敏感
func equalFold() {
	r := strings.EqualFold("test", "test")
	fmt.Println(r)
}

//统计一个字串中包含多少个子串
func countWord(str string, sub_str string) {
	count := strings.Count(str, sub_str)
	fmt.Println(count)
}

//是否包含字段，大小写敏感
func contains(str string, sub_str string) {
	result := strings.Contains(str, sub_str)
	fmt.Println(result)
}

//打开文件，读取文件内容
func open_file() {
	file, err := os.Open("day13/test.txt")
	if nil != err {
		// 处理错误的逻辑
		fmt.Println("发生错误：", err)
		return
	}

	defer file.Close()
	//返回文件信息
	stat, err := file.Stat()
	if nil != err {
		//处理错误
		return
	}
	fmt.Println("文件大小为：", stat.Size())
	fmt.Println("文件Mode为：", stat.Mode())
	fmt.Println("文件是否为文件夹：", stat.IsDir())

	//读取文件内容
	bs := make([]byte, stat.Size())
	_, err = file.Read(bs)
	if nil != err {
		//错误处理
		return
	}
	str := string(bs)
	fmt.Println("文件内容如下：")
	fmt.Println(str)
}

//读取文件内容
func readFile() {
	bs, err := ioutil.ReadFile("test.txt")
	if nil != err {
		return
	}
	str := string(bs)
	fmt.Println("ioutil读取文件内容如下：")
	fmt.Println(str)
}

//创建文件

func createFile() {
	file, err := os.Create("myfile.txt")
	if nil != err {
		return
	}
	defer file.Close()
	file.WriteString("test create file")
}

//列举文件夹

func dirList() {
	dir, err := os.Open(".")
	if nil != err {
		return
	}
	files, err := dir.Readdir(-1)
	if nil != err {
		errors.New("not find...")
		return
	}
	fmt.Println("列举文件名开始...")
	for _, fi := range files {
		fmt.Println(fi.Name())
	}

}

//递归读/取
func recursivelyRead() {
	filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
		fmt.Println(path)
		return nil
	})
}

func readAll() {
	r := strings.NewReader("Go is a general-purpose language designed with systems programming in mind.")

	b, err := ioutil.ReadAll(r)
	if err != nil {
		// log.Fatal(err)
	}

	fmt.Println("%s", b)
}

//读取文件时指定读取的模式
func fileMode() {
	_, error := os.OpenFile("mode_test.txt", os.O_CREATE, os.ModeAppend)
	if error != nil {
		fmt.Print("error")
	}
}
